<html>
<head>
<title>BMediactrl.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #0033b3;}
.s1 { color: #080808;}
.s2 { color: #8c8c8c; font-style: italic;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #0037a6;}
.ln { color: #adadad; font-weight: normal; font-style: normal; }
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
BMediactrl.java</font>
</center></td></tr></table>
<pre><a name="l1"><span class="ln">1    </span></a><span class="s0">import </span><span class="s1">javafx.event.Event;</span>
<a name="l2"><span class="ln">2    </span></a><span class="s0">import </span><span class="s1">javafx.event.EventTarget;</span>
<a name="l3"><span class="ln">3    </span></a><span class="s0">import </span><span class="s1">javafx.event.EventType;</span>
<a name="l4"><span class="ln">4    </span></a><span class="s0">import </span><span class="s1">javafx.fxml.FXML;</span>
<a name="l5"><span class="ln">5    </span></a><span class="s0">import </span><span class="s1">javafx.fxml.Initializable;</span>
<a name="l6"><span class="ln">6    </span></a><span class="s0">import </span><span class="s1">javafx.scene.control.Button;</span>
<a name="l7"><span class="ln">7    </span></a><span class="s0">import </span><span class="s1">javafx.scene.control.ListView;</span>
<a name="l8"><span class="ln">8    </span></a><span class="s0">import </span><span class="s1">javafx.scene.control.ProgressBar;</span>
<a name="l9"><span class="ln">9    </span></a><span class="s0">import </span><span class="s1">javafx.scene.control.TextArea;</span>
<a name="l10"><span class="ln">10   </span></a>
<a name="l11"><span class="ln">11   </span></a><span class="s0">import </span><span class="s1">javax.swing.*;</span>
<a name="l12"><span class="ln">12   </span></a><span class="s0">import </span><span class="s1">java.awt.*;</span>
<a name="l13"><span class="ln">13   </span></a><span class="s0">import </span><span class="s1">java.awt.datatransfer.Clipboard;</span>
<a name="l14"><span class="ln">14   </span></a><span class="s0">import </span><span class="s1">java.awt.datatransfer.StringSelection;</span>
<a name="l15"><span class="ln">15   </span></a><span class="s0">import </span><span class="s1">java.awt.datatransfer.Transferable;</span>
<a name="l16"><span class="ln">16   </span></a><span class="s0">import </span><span class="s1">java.io.*;</span>
<a name="l17"><span class="ln">17   </span></a><span class="s0">import </span><span class="s1">java.net.URL;</span>
<a name="l18"><span class="ln">18   </span></a><span class="s0">import </span><span class="s1">java.util.ResourceBundle;</span>
<a name="l19"><span class="ln">19   </span></a><span class="s0">import </span><span class="s1">java.util.concurrent.LinkedBlockingQueue;</span>
<a name="l20"><span class="ln">20   </span></a><span class="s0">import </span><span class="s1">java.util.concurrent.ThreadPoolExecutor;</span>
<a name="l21"><span class="ln">21   </span></a><span class="s0">import </span><span class="s1">java.util.concurrent.TimeUnit;</span>
<a name="l22"><span class="ln">22   </span></a>
<a name="l23"><span class="ln">23   </span></a><span class="s2">/**</span>
<a name="l24"><span class="ln">24   </span></a> <span class="s2">* 现在的问题：</span>
<a name="l25"><span class="ln">25   </span></a> <span class="s2">* 1：列表启动未就绪（启动时未操作其他组件）</span>
<a name="l26"><span class="ln">26   </span></a> <span class="s2">* 2：运行卡住了,且无法获得CMD结果并加载到进度条来。</span>
<a name="l27"><span class="ln">27   </span></a> <span class="s2">* 3：退出按钮点击无识别。</span>
<a name="l28"><span class="ln">28   </span></a> <span class="s2">*/</span>
<a name="l29"><span class="ln">29   </span></a>
<a name="l30"><span class="ln">30   </span></a><span class="s2">//启动执行的事情：实现这个接口+implements Initializable</span>
<a name="l31"><span class="ln">31   </span></a><span class="s0">public class </span><span class="s1">BMediactrl </span><span class="s0">implements </span><span class="s1">Initializable {</span>
<a name="l32"><span class="ln">32   </span></a>    <span class="s1">@FXML</span>
<a name="l33"><span class="ln">33   </span></a>    <span class="s0">private </span><span class="s1">TextArea res;</span>
<a name="l34"><span class="ln">34   </span></a>    <span class="s1">@FXML</span>
<a name="l35"><span class="ln">35   </span></a>    <span class="s0">private </span><span class="s1">ProgressBar pro;</span>
<a name="l36"><span class="ln">36   </span></a>    <span class="s1">@FXML</span>
<a name="l37"><span class="ln">37   </span></a>    <span class="s0">private </span><span class="s1">ListView wait;</span>
<a name="l38"><span class="ln">38   </span></a>    <span class="s1">@FXML</span>
<a name="l39"><span class="ln">39   </span></a>    <span class="s0">private </span><span class="s1">Button btncopy ;</span>
<a name="l40"><span class="ln">40   </span></a>    <span class="s2">//启动就绪初始化函数</span>
<a name="l41"><span class="ln">41   </span></a>    <span class="s1">@Override</span>
<a name="l42"><span class="ln">42   </span></a>    <span class="s0">public void </span><span class="s1">initialize(URL location, ResourceBundle resources) {</span>
<a name="l43"><span class="ln">43   </span></a>        <span class="s2">//列表框处理-列表框组件显示main.list</span>
<a name="l44"><span class="ln">44   </span></a>        <span class="s1">wait.getItems().clear();</span>
<a name="l45"><span class="ln">45   </span></a>        <span class="s1">wait.setEditable(</span><span class="s0">true</span><span class="s1">);</span>
<a name="l46"><span class="ln">46   </span></a>        <span class="s0">for</span><span class="s1">(String temp:BMedia.list){</span>
<a name="l47"><span class="ln">47   </span></a>
<a name="l48"><span class="ln">48   </span></a>            <span class="s1">File thetemp=</span><span class="s0">new </span><span class="s1">File(temp);</span>
<a name="l49"><span class="ln">49   </span></a>            <span class="s1">wait.getItems().add(thetemp.getName());</span>
<a name="l50"><span class="ln">50   </span></a>
<a name="l51"><span class="ln">51   </span></a>        <span class="s1">}</span>
<a name="l52"><span class="ln">52   </span></a>        <span class="s1">btncopy.setText(</span><span class="s3">&quot;CopyT&quot;</span><span class="s1">);</span>
<a name="l53"><span class="ln">53   </span></a>        <span class="s1">pro.setVisible(</span><span class="s0">true</span><span class="s1">);</span>
<a name="l54"><span class="ln">54   </span></a>        <span class="s1">pro.setProgress(</span><span class="s4">0</span><span class="s1">);</span>
<a name="l55"><span class="ln">55   </span></a>    <span class="s1">}</span>
<a name="l56"><span class="ln">56   </span></a>
<a name="l57"><span class="ln">57   </span></a>    <span class="s2">//复制按钮的绑定事件</span>
<a name="l58"><span class="ln">58   </span></a>    <span class="s1">@FXML</span>
<a name="l59"><span class="ln">59   </span></a>    <span class="s0">public void </span><span class="s1">btncopy(Event event) </span><span class="s0">throws </span><span class="s1">Exception{</span>
<a name="l60"><span class="ln">60   </span></a>
<a name="l61"><span class="ln">61   </span></a>
<a name="l62"><span class="ln">62   </span></a>        <span class="s2">//操作剪辑版：https://www.jianshu.com/p/060a0f42bf36</span>
<a name="l63"><span class="ln">63   </span></a>        <span class="s1">Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();</span>
<a name="l64"><span class="ln">64   </span></a>        <span class="s1">Transferable trans = </span><span class="s0">new </span><span class="s1">StringSelection(res.getText());</span>
<a name="l65"><span class="ln">65   </span></a>        <span class="s1">clipboard.setContents(trans, </span><span class="s0">null</span><span class="s1">);</span>
<a name="l66"><span class="ln">66   </span></a>        <span class="s1">JOptionPane dhk=</span><span class="s0">new </span><span class="s1">JOptionPane();</span>
<a name="l67"><span class="ln">67   </span></a>        <span class="s1">dhk.showMessageDialog(</span><span class="s0">null</span><span class="s1">,</span><span class="s3">&quot;将处理结果复制到剪辑版成功。&quot;</span><span class="s1">,</span><span class="s3">&quot;Copy&quot;</span><span class="s1">,JOptionPane.WARNING_MESSAGE);</span>
<a name="l68"><span class="ln">68   </span></a>    <span class="s1">}</span>
<a name="l69"><span class="ln">69   </span></a>
<a name="l70"><span class="ln">70   </span></a>    <span class="s2">//开始mp4-&gt;m3u8和退出程序的绑定事件</span>
<a name="l71"><span class="ln">71   </span></a>    <span class="s1">@FXML</span>
<a name="l72"><span class="ln">72   </span></a>    <span class="s0">public void </span><span class="s1">btn(Event event) </span><span class="s0">throws </span><span class="s1">Exception{</span>
<a name="l73"><span class="ln">73   </span></a>        <span class="s1">EventType cc=event.getEventType();</span>
<a name="l74"><span class="ln">74   </span></a>        <span class="s1">EventTarget dd=event.getTarget();</span>
<a name="l75"><span class="ln">75   </span></a>        <span class="s1">Button button=(Button)dd;</span>
<a name="l76"><span class="ln">76   </span></a>        <span class="s1">System.out.println(</span><span class="s3">&quot;[组件事件响应]&quot;</span><span class="s1">+cc+</span><span class="s3">&quot;:&quot;</span><span class="s1">+button.getText());</span>
<a name="l77"><span class="ln">77   </span></a>        <span class="s0">if</span><span class="s1">(button.getText().equals(</span><span class="s3">&quot;退出程序&quot;</span><span class="s1">)){System.exit(</span><span class="s4">0</span><span class="s1">);}</span>
<a name="l78"><span class="ln">78   </span></a>        <span class="s2">//输入框文本框显示。。。</span>
<a name="l79"><span class="ln">79   </span></a>        <span class="s1">res.setText(</span><span class="s3">&quot;开始处理...&quot;</span><span class="s1">);</span>
<a name="l80"><span class="ln">80   </span></a>        <span class="s1">res.setEditable(</span><span class="s0">false</span><span class="s1">);</span>
<a name="l81"><span class="ln">81   </span></a>        <span class="s2">//进程结束。。。</span>
<a name="l82"><span class="ln">82   </span></a>        <span class="s1">RuncmdSim(</span><span class="s3">&quot;cmd.exe /c taskkill /f /t /im ffmpeg.exe&quot;</span><span class="s1">);</span>
<a name="l83"><span class="ln">83   </span></a>        <span class="s1">Thread.sleep(</span><span class="s4">1000</span><span class="s1">);</span>
<a name="l84"><span class="ln">84   </span></a>
<a name="l85"><span class="ln">85   </span></a>
<a name="l86"><span class="ln">86   </span></a>        <span class="s2">//列表框处理</span>
<a name="l87"><span class="ln">87   </span></a>        <span class="s0">for</span><span class="s1">(String temp:BMedia.list){</span>
<a name="l88"><span class="ln">88   </span></a>            <span class="s1">File thetemp=</span><span class="s0">new </span><span class="s1">File(temp);</span>
<a name="l89"><span class="ln">89   </span></a>            <span class="s0">if</span><span class="s1">(thetemp.length()&gt;</span><span class="s4">1000</span><span class="s1">){</span>
<a name="l90"><span class="ln">90   </span></a>                <span class="s2">//编辑框文本框显示内容</span>
<a name="l91"><span class="ln">91   </span></a>                <span class="s1">res.setText(res.getText()+</span><span class="s3">&quot;</span><span class="s5">\r\n</span><span class="s3">&quot;</span><span class="s1">+</span><span class="s3">&quot;开始处理&quot;</span><span class="s1">+thetemp.getName()+</span><span class="s3">&quot;...&quot;</span><span class="s1">);</span>
<a name="l92"><span class="ln">92   </span></a>                <span class="s2">//创建存放处理结果的文件夹(demo目录)</span>
<a name="l93"><span class="ln">93   </span></a>                <span class="s1">File newdir= </span><span class="s0">new </span><span class="s1">File(BMedia.mpdir+</span><span class="s3">&quot;</span><span class="s5">\\</span><span class="s3">&quot;</span><span class="s1">+thetemp.getName().replaceAll (</span><span class="s3">&quot;.mp4&quot;</span><span class="s1">,</span><span class="s3">&quot;&quot;</span><span class="s1">));</span>
<a name="l94"><span class="ln">94   </span></a>                <span class="s0">if</span><span class="s1">(!newdir.isDirectory()){newdir.mkdir();}</span>
<a name="l95"><span class="ln">95   </span></a>                <span class="s2">//获得CMD命令行</span>
<a name="l96"><span class="ln">96   </span></a>                <span class="s1">String cmd=Getcmd(temp,newdir+</span><span class="s3">&quot;</span><span class="s5">\\</span><span class="s3">&quot;</span><span class="s1">+</span><span class="s3">&quot;ouput.mp4&quot;</span><span class="s1">);</span>
<a name="l97"><span class="ln">97   </span></a>                <span class="s1">System.out.println(</span><span class="s3">&quot;获得的CMD命令为:&quot;</span><span class="s1">+cmd);</span>
<a name="l98"><span class="ln">98   </span></a>                <span class="s2">// 执行CMD命令行</span>
<a name="l99"><span class="ln">99   </span></a>                <span class="s2">// RuncmdSim():简单执行，RuncmdFuza()：复杂执行，可能有多线程功能（该方法由尽力哥写的）。</span>
<a name="l100"><span class="ln">100  </span></a>                <span class="s1">RuncmdFuza(cmd);</span>
<a name="l101"><span class="ln">101  </span></a>            <span class="s1">}</span>
<a name="l102"><span class="ln">102  </span></a>        <span class="s1">}</span>
<a name="l103"><span class="ln">103  </span></a>        <span class="s1">res.setText(res.getText()+</span><span class="s3">&quot;</span><span class="s5">\r\n</span><span class="s3">&quot;</span><span class="s1">+</span><span class="s3">&quot;处理结束。&quot;</span><span class="s1">);</span>
<a name="l104"><span class="ln">104  </span></a>        <span class="s1">System.out.println(</span><span class="s3">&quot;[按钮事件运行结束]&quot;</span><span class="s1">);</span>
<a name="l105"><span class="ln">105  </span></a>    <span class="s1">}</span>
<a name="l106"><span class="ln">106  </span></a>
<a name="l107"><span class="ln">107  </span></a>
<a name="l108"><span class="ln">108  </span></a>    <span class="s2">//方法函数：得到cmd命令</span>
<a name="l109"><span class="ln">109  </span></a>    <span class="s0">public </span><span class="s1">String Getcmd(String inputname,String outputname){</span>
<a name="l110"><span class="ln">110  </span></a>        <span class="s1">String ms=</span><span class="s3">&quot;30&quot;</span><span class="s1">;</span>
<a name="l111"><span class="ln">111  </span></a>        <span class="s1">String temp=BMedia.ffmpeg+</span><span class="s3">&quot; -i &quot;</span><span class="s1">+inputname+</span><span class="s3">&quot; -c:v h264 -c:a aac -strict -2 -f hls -hls_time &quot;</span><span class="s1">+ms+</span><span class="s3">&quot; -hls_list_size 0 &quot;</span><span class="s1">+outputname;</span>
<a name="l112"><span class="ln">112  </span></a>        <span class="s0">return </span><span class="s1">temp;</span>
<a name="l113"><span class="ln">113  </span></a>    <span class="s1">}</span>
<a name="l114"><span class="ln">114  </span></a>
<a name="l115"><span class="ln">115  </span></a>    <span class="s2">//方法函数：RuncmdSim:执行cmd命令（简单型命令）</span>
<a name="l116"><span class="ln">116  </span></a>    <span class="s0">public </span><span class="s1">String RuncmdSim(String command) </span><span class="s0">throws </span><span class="s1">Exception{</span>
<a name="l117"><span class="ln">117  </span></a>    <span class="s0">if</span><span class="s1">(command==</span><span class="s0">null</span><span class="s1">){command=</span><span class="s3">&quot;cmd.exe /c dir d:&quot;</span><span class="s1">;}</span>
<a name="l118"><span class="ln">118  </span></a>        <span class="s2">//java.lang.Runtime.getRuntime().exec(command);</span>
<a name="l119"><span class="ln">119  </span></a>        <span class="s1">Process process = java.lang.Runtime.getRuntime().exec(command);</span>
<a name="l120"><span class="ln">120  </span></a>        <span class="s1">InputStream inputStream = process.getInputStream();</span>
<a name="l121"><span class="ln">121  </span></a>        <span class="s1">BufferedReader br = </span><span class="s0">new </span><span class="s1">BufferedReader(</span><span class="s0">new </span><span class="s1">InputStreamReader(inputStream,</span><span class="s3">&quot;gb2312&quot;</span><span class="s1">));</span>
<a name="l122"><span class="ln">122  </span></a>        <span class="s1">String line = </span><span class="s0">null</span><span class="s1">;</span>
<a name="l123"><span class="ln">123  </span></a>        <span class="s1">String Lineall=</span><span class="s0">null</span><span class="s1">;</span>
<a name="l124"><span class="ln">124  </span></a>        <span class="s0">while</span><span class="s1">((line = br.readLine()) != </span><span class="s0">null</span><span class="s1">) {</span>
<a name="l125"><span class="ln">125  </span></a>            <span class="s1">Lineall=Lineall+</span><span class="s3">&quot;</span><span class="s5">\r\n</span><span class="s3">&quot;</span><span class="s1">+line;</span>
<a name="l126"><span class="ln">126  </span></a>        <span class="s1">}</span>
<a name="l127"><span class="ln">127  </span></a>        <span class="s0">return </span><span class="s1">Lineall;</span>
<a name="l128"><span class="ln">128  </span></a>    <span class="s1">}</span>
<a name="l129"><span class="ln">129  </span></a>
<a name="l130"><span class="ln">130  </span></a>
<a name="l131"><span class="ln">131  </span></a>    <span class="s2">//方法函数：RuncmdFuza:执行cmd命令（复杂型命令），</span>
<a name="l132"><span class="ln">132  </span></a>    <span class="s2">//由ThreadPoolExecutor executor、RuncmdFuza方法、clearStream方法构成。</span>
<a name="l133"><span class="ln">133  </span></a>    <span class="s0">private static </span><span class="s1">ThreadPoolExecutor executor;</span>
<a name="l134"><span class="ln">134  </span></a>    <span class="s0">static </span><span class="s1">{</span>
<a name="l135"><span class="ln">135  </span></a>        <span class="s2">//根据实际情况创建线程池</span>
<a name="l136"><span class="ln">136  </span></a>        <span class="s1">executor = </span><span class="s0">new </span><span class="s1">ThreadPoolExecutor(</span><span class="s4">10</span><span class="s1">,</span>
<a name="l137"><span class="ln">137  </span></a>                <span class="s4">20</span><span class="s1">,</span>
<a name="l138"><span class="ln">138  </span></a>                <span class="s4">5</span><span class="s1">,</span>
<a name="l139"><span class="ln">139  </span></a>                <span class="s1">TimeUnit.SECONDS,</span>
<a name="l140"><span class="ln">140  </span></a>                <span class="s0">new </span><span class="s1">LinkedBlockingQueue&lt;Runnable&gt;(</span><span class="s4">1024</span><span class="s1">),</span>
<a name="l141"><span class="ln">141  </span></a>                <span class="s0">new </span><span class="s1">ThreadPoolExecutor.AbortPolicy());</span>
<a name="l142"><span class="ln">142  </span></a>    <span class="s1">}</span>
<a name="l143"><span class="ln">143  </span></a>    <span class="s0">public  boolean </span><span class="s1">RuncmdFuza(String cmd) </span><span class="s0">throws </span><span class="s1">IOException, InterruptedException {</span>
<a name="l144"><span class="ln">144  </span></a>
<a name="l145"><span class="ln">145  </span></a>
<a name="l146"><span class="ln">146  </span></a>        <span class="s1">Process process =java.lang.Runtime.getRuntime().exec(cmd);</span>
<a name="l147"><span class="ln">147  </span></a>
<a name="l148"><span class="ln">148  </span></a>        <span class="s2">//消费正常日志</span>
<a name="l149"><span class="ln">149  </span></a>        <span class="s1">clearStream(process.getInputStream());</span>
<a name="l150"><span class="ln">150  </span></a>        <span class="s2">//消费错误日志</span>
<a name="l151"><span class="ln">151  </span></a>        <span class="s1">clearStream(process.getErrorStream());</span>
<a name="l152"><span class="ln">152  </span></a>
<a name="l153"><span class="ln">153  </span></a>        <span class="s2">//i为返回值，判断是否执行成功</span>
<a name="l154"><span class="ln">154  </span></a>        <span class="s0">int </span><span class="s1">i = process.waitFor();</span>
<a name="l155"><span class="ln">155  </span></a>        <span class="s0">if </span><span class="s1">(i != </span><span class="s4">0</span><span class="s1">) {</span>
<a name="l156"><span class="ln">156  </span></a>
<a name="l157"><span class="ln">157  </span></a>            <span class="s0">return false</span><span class="s1">;</span>
<a name="l158"><span class="ln">158  </span></a>        <span class="s1">}</span>
<a name="l159"><span class="ln">159  </span></a>        <span class="s0">return true</span><span class="s1">;</span>
<a name="l160"><span class="ln">160  </span></a>    <span class="s1">}</span>
<a name="l161"><span class="ln">161  </span></a>
<a name="l162"><span class="ln">162  </span></a>    <span class="s0">private  void </span><span class="s1">clearStream(InputStream stream) {</span>
<a name="l163"><span class="ln">163  </span></a>        <span class="s2">//处理buffer的线程</span>
<a name="l164"><span class="ln">164  </span></a>        <span class="s1">executor.execute(</span><span class="s0">new </span><span class="s1">Runnable() {</span>
<a name="l165"><span class="ln">165  </span></a>            <span class="s1">@Override</span>
<a name="l166"><span class="ln">166  </span></a>            <span class="s0">public void </span><span class="s1">run() {</span>
<a name="l167"><span class="ln">167  </span></a>                <span class="s1">String line = </span><span class="s0">null</span><span class="s1">;</span>
<a name="l168"><span class="ln">168  </span></a>                <span class="s0">double </span><span class="s1">ddd =</span><span class="s4">0.1</span><span class="s1">;</span>
<a name="l169"><span class="ln">169  </span></a>
<a name="l170"><span class="ln">170  </span></a>                <span class="s0">try </span><span class="s1">(BufferedReader in = </span><span class="s0">new </span><span class="s1">BufferedReader(</span><span class="s0">new </span><span class="s1">InputStreamReader(stream));) {</span>
<a name="l171"><span class="ln">171  </span></a>                    <span class="s0">while </span><span class="s1">((line = in.readLine()) != </span><span class="s0">null</span><span class="s1">) {</span>
<a name="l172"><span class="ln">172  </span></a>                        <span class="s1">pro.setProgress(</span><span class="s4">0.6</span><span class="s1">);</span>
<a name="l173"><span class="ln">173  </span></a>                        <span class="s2">//ddd=ddd+0.01;</span>
<a name="l174"><span class="ln">174  </span></a>                        <span class="s2">//这里输出进度 line</span>
<a name="l175"><span class="ln">175  </span></a>
<a name="l176"><span class="ln">176  </span></a>                        <span class="s1">System.out.println(</span><span class="s3">&quot;-------&quot;</span><span class="s1">+line);</span>
<a name="l177"><span class="ln">177  </span></a>                    <span class="s1">}</span>
<a name="l178"><span class="ln">178  </span></a>
<a name="l179"><span class="ln">179  </span></a>                <span class="s1">} </span><span class="s0">catch </span><span class="s1">(IOException e) {</span>
<a name="l180"><span class="ln">180  </span></a>                    <span class="s2">//  logger.error(&quot;exec error : {}&quot;, e);</span>
<a name="l181"><span class="ln">181  </span></a>                <span class="s1">}</span>
<a name="l182"><span class="ln">182  </span></a>            <span class="s1">}</span>
<a name="l183"><span class="ln">183  </span></a>        <span class="s1">});</span>
<a name="l184"><span class="ln">184  </span></a>    <span class="s1">}</span>
<a name="l185"><span class="ln">185  </span></a>
<a name="l186"><span class="ln">186  </span></a><span class="s1">}</span>
<a name="l187"><span class="ln">187  </span></a></pre>
</body>
</html>